package main

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

// logLevel 函数演示如何配置日志级别
// 通过设置日志级别可以控制哪些级别的日志会被记录
func logLevel() {
	// 创建开发环境日志配置
	cfg := zap.NewDevelopmentConfig()
	// 设置日志级别为 Info，这意味着将记录Info及以上级别（Warn, Error等）的日志
	// Debug级别的日志由于级别低于Info，将不会被记录
	cfg.Level = zap.NewAtomicLevelAt(zap.InfoLevel)
	// 根据配置创建日志记录器
	logger, _ := cfg.Build()

	// 不同级别的日志输出演示
	// Debug级别日志：由于设置了Info级别，Debug日志不会被记录
	logger.Debug("调试信息")
	// Info级别日志：正常记录
	logger.Info("普通信息")
	// Warn级别日志：正常记录
	logger.Warn("警告信息")
	// Error级别日志：正常记录
	logger.Error("错误信息")
}

// timeFormat 函数演示如何自定义日志时间格式
// 可以修改默认的时间显示格式，使其更符合本地化需求
func timeFormat() {
	// 创建开发环境日志配置
	cfg := zap.NewDevelopmentConfig()
	// 自定义日志时间格式为 "年-月-日 时:分:秒"
	// 使用Go语言特定的时间格式模板：2006-01-02 15:04:05
	cfg.EncoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05")
	// 根据配置创建日志记录器
	logger, _ := cfg.Build()

	// 不同级别的日志输出演示
	logger.Debug("调试信息")
	logger.Info("普通信息")
	logger.Warn("警告信息")
	logger.Error("错误信息")
}

// sugar 函数演示Sugar日志器的使用
// Sugar日志器提供更简洁的格式化API，类似于fmt.Sprintf
func sugar() {
	logger, _ := zap.NewDevelopment()
	// 传统方式需要使用fmt.Sprintf进行格式化
	// logger.Info(fmt.Sprintf("my name is %s", "fengfeng"))

	// 使用Sugar日志器可以更简洁地进行格式化
	sl := logger.Sugar()
	sl.Infof("my name is %s", "fengfeng")
}

// structs 函数演示结构化日志的使用
// 结构化日志允许在日志中添加额外的字段信息，便于日志分析和搜索
func structs() {
	// 创建开发环境日志器
	logger, _ := zap.NewDevelopment()

	// 记录简单日志（不包含额外字段）
	logger.Info("this is log")

	// 记录带结构化字段的日志
	// 结构化字段可以提供更丰富的上下文信息
	logger.Info("this is log",
		zap.String("name", "fengfeng"), // 字符串字段：记录用户姓名
		zap.Int("age", 12),             // 整数字段：记录用户年龄
		zap.Bool("isGender", true),     // 布尔字段：记录性别信息
	)
}

// main 函数是程序入口点
// 通过取消注释不同的函数调用来测试不同的日志配置功能
func main() {
	// logLevel()   // 测试日志级别配置
	// timeFormat() // 测试时间格式自定义
	// sugar()      // 测试Sugar日志器
	structs() // 测试结构化日志
}
